package com.atguigu.ssyx.acl.service.impl;

import com.atguigu.ssyx.acl.mapper.PermisionMapper;
import com.atguigu.ssyx.acl.service.PermissionService;
//import com.atguigu.ssyx.acl.service.RolePermissionService;
import com.atguigu.ssyx.acl.utils.PermissionHelper;
import com.atguigu.ssyx.model.acl.Permission;
import com.atguigu.ssyx.model.acl.RolePermission;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class PermissionServiceIml extends ServiceImpl<PermisionMapper, Permission> implements PermissionService {

//    @Autowired
//    private RolePermissionService rolePermissionService;

    //查询所有菜单
    @Override
    public List<Permission> queryAllPermission() {
        //1 查询所有菜单
        List<Permission> allPermissionList =
                baseMapper.selectList(null);

        //2 转换要求数据格式
        List<Permission> result = PermissionHelper.buildPermission(allPermissionList);

        return result;
    }

    //递归删除菜单
    @Override
    public void removeChildById(Long id) {
        //1 创建List集合idList，封装所有要删除菜单id
        List<Long> idList = new ArrayList<>();

        //根据当前菜单id,获取当前菜单下面所有子菜单，
        //如果子菜单下面还有子菜单，都要获取到
        //重点：递归找当前菜单子菜单
        this.getAllPermissionId(id,idList);

        //设置当前菜单id
        idList.add(id);

        //调用方法根据多个菜单id删除
        baseMapper.deleteBatchIds(idList);
    }

//    //获取所有权限，和根据角色id查询角色分配权限列表
//    @Override
//    public List<Permission> getPerminssionByRoleId(Long roleId) {     // 修改过
//        //1 查询所有权限
//        List<Permission> allPermissionsList = baseMapper.selectList(null);   //修改过

//        List<Permission> allPermissionsList1  = PermissionHelper.buildPermission(allPermissionList);
        //2 根据角色id查询角色分配权限列表
        //2.1 根据角色id查询 角色权限关系表 role_perssion查询角色分配权限id列表
        //List<RolePermission>
//        LambdaQueryWrapper<RolePermission> wrapper = new LambdaQueryWrapper<>();
//        //设置查询条件，根据角色id roleId
//        wrapper.eq(RolePermission::getPermissionId,roleId);
//        List<RolePermission> rolePermissionList = rolePermissionService.list(wrapper);
//
//        //2.2 通过第一步返回集合，获取所有权限id的列表List<RolePermission> --  List<Long>
//        List<Long> permissionsList =
//                rolePermissionList.stream()
//                        .map(item -> item.getPermissionId())
//                        .collect(Collectors.toList());

        //2.3 创建新的list集合，用于存储角色配置权限
//        List<Permission> assignPermissionList = new ArrayList<>();
//
//        //2.4 遍历所有权限列表allPermissionList,得到每个权限
//        //判断所有权限里面是否包含已经分配的权限id，封装到2.3里面新的list集合
//        for (Permission permission:allPermissionsList) {
//            //判断
//            if(permissionsList.contains(permission.getId())) {
//                assignPermissionList.add(permission);
//            }
//        }

//        //封装到map,返回
//        Map<String,Object> result = new HashMap<>();
//        //所有权限列表
//        result.put("allPermissionsList",allPermissionsList);
//        //角色分配权限列表
//        result.put("assignPermissions",assignPermissionList);
//        return  assignPermissionList;    // 修改过
//    }

    //为角色进行分配权限
//    @Override
//    public void saveRolePermission(Long roleId, Long[] permissionIds) {
//        //1 删除角色已经分配过的权限数据
//        //根据角色id删除role_permission表里面对应数据
//        LambdaQueryWrapper<RolePermission> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(RolePermission::getRoleId,roleId);
//        rolePermissionService.remove(wrapper);

        //2 重新分配
        //roleId:1 permission:2 3
        //遍历多个权限id,得到每个权限id,拿着每个权限id + 角色id添加角色权限关系表
//        for (Long permissionId:permissionIds) {
//            RolePermission rolePermission = new RolePermission();
//            rolePermission.setRoleId(roleId);
//            rolePermission.setPermissionId(permissionId);
//            rolePermissionService.save(rolePermission);
//        }
//        List<RolePermission> list = new ArrayList<>();
//        for (Long permissionId: permissionIds) {
//            RolePermission rolePermission = new RolePermission();
//            rolePermission.setRoleId(roleId);
//            rolePermission.setPermissionId(permissionId);
//            //放到list集合
//            list.add(rolePermission);
//        }
//        //调用方法添加
//        rolePermissionService.saveBatch(list);
//    }

    //重点：递归找当前菜单下面所有子菜单
    //第一个参数是当前菜单id
    //第二个参数最终封装list集合，包含所有菜单id
    private void getAllPermissionId(Long id, List<Long> idList) {
        //根据当前菜单id查询下面子菜单
        //select * form permission where pid=2
        LambdaQueryWrapper<Permission> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Permission::getPid,id);
        List<Permission> childList = baseMapper.selectList(wrapper);

        //递归查询是否还有子菜单，有继续递归查询
        childList.stream().forEach(item -> {
            //封装菜单id到idList集合里面
            idList.add(item.getId());
            //递归
            this.getAllPermissionId(item.getId(),idList);
        });

    }
}
